package redis.clients.jedis.tests.commands;

import org.junit.Test;

import redis.clients.util.SafeEncoder;

public class HyperLogLogCommandsTest extends JedisCommandTestBase {

    @Test
    public void pfadd() {
	long status = jedis.pfadd("foo", "a");
	assertEquals(1, status);
	
	status = jedis.pfadd("foo", "a");
	assertEquals(0, status);
    }
    
    @Test
    public void pfaddBinary() {
	byte[] bFoo = SafeEncoder.encode("foo");
	byte[] bBar = SafeEncoder.encode("bar");
	byte[] bBar2 = SafeEncoder.encode("bar2");
	
	long status = jedis.pfadd(bFoo, bBar, bBar2);
	assertEquals(1, status);
	
	status = jedis.pfadd(bFoo, bBar, bBar2);
	assertEquals(0, status);
    }
    
    @Test
    public void pfcount() {
	long status = jedis.pfadd("hll", "foo", "bar", "zap");
	assertEquals(1, status);
	
	status = jedis.pfadd("hll", "zap", "zap", "zap");
	assertEquals(0, status);
	
	status = jedis.pfadd("hll", "foo", "bar");
	assertEquals(0, status);
	
	status = jedis.pfcount("hll");
	assertEquals(3, status);
    }
    
    @Test
    public void pfcounts() {
	long status = jedis.pfadd("hll_1", "foo", "bar", "zap");
	assertEquals(1, status);
    status = jedis.pfadd("hll_2", "foo", "bar", "zap");
    assertEquals(1, status);

	status = jedis.pfadd("hll_3", "foo", "bar", "baz");
    assertEquals(1, status);
    status = jedis.pfcount("hll_1");
    assertEquals(3, status);
    status = jedis.pfcount("hll_2");
    assertEquals(3, status);
    status = jedis.pfcount("hll_3");
    assertEquals(3, status);

    status = jedis.pfcount("hll_1", "hll_2");
    assertEquals(3, status);

    status = jedis.pfcount("hll_1", "hll_2", "hll_3");
    assertEquals(4, status);


    }

    @Test
    public void pfcountBinary() {
	byte[] bHll = SafeEncoder.encode("hll");
	byte[] bFoo = SafeEncoder.encode("foo");
	byte[] bBar = SafeEncoder.encode("bar");
	byte[] bZap = SafeEncoder.encode("zap");
	
	long status = jedis.pfadd(bHll, bFoo, bBar, bZap);
	assertEquals(1, status);
	
	status = jedis.pfadd(bHll, bZap, bZap, bZap);
	assertEquals(0, status);
	
	status = jedis.pfadd(bHll, bFoo, bBar);
	assertEquals(0, status);
	
	status = jedis.pfcount(bHll);
	assertEquals(3, status);
    }
    
    @Test
    public void pfmerge() {
	long status = jedis.pfadd("hll1", "foo", "bar", "zap", "a");
	assertEquals(1, status);
	
	status = jedis.pfadd("hll2", "a", "b", "c", "foo");
	assertEquals(1, status);
	
	String mergeStatus = jedis.pfmerge("hll3", "hll1", "hll2");
	assertEquals("OK", mergeStatus);
	
	status = jedis.pfcount("hll3");
	assertEquals(6, status);
    }
    
    @Test
    public void pfmergeBinary() {
	byte[] bHll1 = SafeEncoder.encode("hll1");
	byte[] bHll2 = SafeEncoder.encode("hll2");
	byte[] bHll3 = SafeEncoder.encode("hll3");
	byte[] bFoo = SafeEncoder.encode("foo");
	byte[] bBar = SafeEncoder.encode("bar");
	byte[] bZap = SafeEncoder.encode("zap");
	byte[] bA = SafeEncoder.encode("a");
	byte[] bB = SafeEncoder.encode("b");
	byte[] bC = SafeEncoder.encode("c");
	
	long status = jedis.pfadd(bHll1, bFoo, bBar, bZap, bA);
	assertEquals(1, status);
	
	status = jedis.pfadd(bHll2, bA, bB, bC, bFoo);
	assertEquals(1, status);
	
	String mergeStatus = jedis.pfmerge(bHll3, bHll1, bHll2);
	assertEquals("OK", mergeStatus);
	
	status = jedis.pfcount("hll3");
	assertEquals(6, status);
    }
}
